package com.hl.card.credit.pub.utils;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;


public class MD5Tools{
	/**
	 * 初始化
	 * @return
	 */
	public static MD5Tools getInit(){
		return new MD5Tools();
	}


	/**
	 *  MD5 加密   转成成大写
	 * 
	 */
	public static String MD5(String origin) {
		String resultString = MD5Encode(origin,"UTF-8");
		if(resultString != null && !resultString.isEmpty()){
			return resultString.toUpperCase();
		}		
		return resultString;
	}
	
	
	/**
	 *  MD5 加密  
	 * 
	 */
	public static String md5(String origin) {
		String resultString = MD5Encode(origin,"UTF-8");
		return resultString;
	}
	
	/**
	 * MD5 比较 匹配origin 加密后是否等于md5
	 * @param origin 密码， 未加密
	 * @param md5 已加密字符串
	 * @return
	 */
	public static boolean ecompareMD5(String origin,String md5) {
		String result =MD5(origin);
		return md5.equals(result);
	}
	

	/**
	 * MD5加密
	 * @param str
	 * @param charsetname
	 * @return
	 */
	public static String MD5Encode(String str,String charsetname) {
		try {
			MessageDigest md = MessageDigest.getInstance("MD5");
			md.update(str.getBytes(charsetname));
			byte[] byteDigest = md.digest();
			int i;
			StringBuffer buf = new StringBuffer("");
			for (int offset = 0; offset < byteDigest.length; offset++) {
				i = byteDigest[offset];
				if (i < 0)
					i += 256;
				if (i < 16)
					buf.append("0");
				buf.append(Integer.toHexString(i));
			}
			return buf.toString();
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	
	/**
	 * 将源字符串使用MD5加密为字节数组
	 * @param source
	 * @return
	 */
	public static byte[] encode2bytes(String source) {
		byte[] result = null;
		try {
			MessageDigest md = MessageDigest.getInstance("MD5");
			md.reset();
			md.update(source.getBytes("UTF-8"));
			result = md.digest();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		
		return result;
	}
	
	/**
	 * 将源字符串使用MD5加密为32位16进制数
	 * @param source
	 * @return
	 */
	public static String encode2hex(String source) {
		byte[] data = encode2bytes(source);

		StringBuffer hexString = new StringBuffer();
		for (int i = 0; i < data.length; i++) {
			String hex = Integer.toHexString(0xff & data[i]);
			
			if (hex.length() == 1) {
				hexString.append('0');
			}
			
			hexString.append(hex);
		}
		
		return hexString.toString();
	}
	
	/**
	 * 验证字符串是否匹配
	 * @param unknown 待验证的字符串
	 * @param okHex	使用MD5加密过的16进制字符串
	 * @return	匹配返回true，不匹配返回false
	 */
	public static boolean validate(String unknown , String okHex) {
		return okHex.equals(encode2hex(unknown));
	}
	
	/**
	 * 自定义加密算法
	 * @param src
	 */
	public static String custom_md5(String src) {
	    char psw = 'ゅ';
	    String s="";
	    char srcArray[] = src.toCharArray();
	    for (int i = 0; i < src.length(); i++) {
	        srcArray[i] = (char) (srcArray[i] ^ psw);
	        s+=srcArray[i];
	    }
	    return s;
	}
	/**
	 * 自定义解密算法
	 * @param src
	 */
	public static String un_custom_md5(String src)
	{
		String result="";
	    char psw = 'ゅ';
		char srcArray[] = src.toCharArray();
		for (int i = 0; i < src.length(); i++) {
		srcArray[i] = (char) (srcArray[i] ^ psw);
		result+=srcArray[i];
	    }
		return result;
	}
	
	public static void main(String[] args) {
	String s=un_custom_md5("ヾェヷムヱヰヷルペユリメムェタェサササェォェヨムヶヶヤモムェタェェォェヱヷヤレルペメヤヱヤェタマヾェヱヷヤレルペユリメムェタェヂゲシェォェヶヱヤヷヱペヶヱヤヱレリルェタェェォェムルメペヶヱヤヱレリルェタェェォェヶヱヤヷヱペヱレヨムェタェェォェムルメペヱレヨムェタェェォェャヷリヨペヱレヨムェタェサゲタササェォェヤヷヷレンムペヱレヨムェタェゴソタシシェォェャヷリヨペヶヱヤヱレリルェタェ䤊䖵ェォェヤヷヷレンムペヶヱヤヱレリルェタェ排縩맺ェォェユリヶヱペヱレヨムェタェコソシェォェヲヿェタェゼケケカグェォェーヿェタェエェォェヲヿペルヰヨェタェエェォェーヿペルヰヨェタェエェォェヷヿェタェエェォェヷヿペルヰヨェタェエェォェヷヿゴェタェゴケソソカサェォェヷヿゴペルヰヨェタェゴザェォェヷヿシェタェゼケケカグェォェヷヿシペルヰヨェタェゼゼェォェーヲヶェタェエェォェーヲヿェタェエェォェーヲヽェタェエェォェーヲペルヰヨェタェエェォェヷヲヶェタェエェォェヷヲヽェタェエェォェヷヲペルヰヨェタェエェォェヶヲヿェタェシゼザゼカサェォェヶヲヿペルヰヨェタェゲェォェヱメヿェタェエェォェヱメヿペルヰヨェタェエェォェモヲヶェタェエェォェモヲヽェタェエェォェモヲペルヰヨェタェエェォェメヲヶェタェエェォェメヲヽェタェエェォェメヲペルヰヨェタェエェヸォヾェヱヷヤレルペユリメムェタェヂソサェォェヶヱヤヷヱペヶヱヤヱレリルェタェェォェムルメペヶヱヤヱレリルェタェェォェヶヱヤヷヱペヱレヨムェタェェォェムルメペヱレヨムェタェェォェャヷリヨペヱレヨムェタェサソタゴコェォェヤヷヷレンムペヱレヨムェタェゴゲタサゴェォェャヷリヨペヶヱヤヱレリルェタェ䤊䖵ェォェヤヷヷレンムペヶヱヤヱレリルェタェ排縩맺ェォェユリヶヱペヱレヨムェタェグシグェォェヲヿェタェゼケケカグェォェーヿェタェエェォェヲヿペルヰヨェタェエェォェーヿペルヰヨェタェエェォェヷヿェタェエェォェヷヿペルヰヨェタェエェォェヷヿゴェタェゴケソソカサェォェヷヿゴペルヰヨェタェエェォェヷヿシェタェゼケケカグェォェヷヿシペルヰヨェタェエェォェーヲヶェタェエェォェーヲヿェタェエェォェーヲヽェタェエェォェーヲペルヰヨェタェエェォェヷヲヶェタェエェォェヷヲヽェタェエェォェヷヲペルヰヨェタェエェォェヶヲヿェタェシゼザゼカサェォェヶヲヿペルヰヨェタェエェォェヱメヿェタェエェォェヱメヿペルヰヨェタェエェォェモヲヶェタェエェォェモヲヽェタェエェォェモヲペルヰヨェタェエェォェメヲヶェタェエェォェメヲヽェタェエェォェメヲペルヰヨェタェエェヸォヾェヱヷヤレルペユリメムェタェノゴサコェォェヶヱヤヷヱペヶヱヤヱレリルェタェェォェムルメペヶヱヤヱレリルェタェェォェヶヱヤヷヱペヱレヨムェタェェォェムルメペヱレヨムェタェェォェャヷリヨペヱレヨムェタェゴサタザゴェォェヤヷヷレンムペヱレヨムェタェゴコタシグェォェャヷリヨペヶヱヤヱレリルェタェ嵴架ェォェヤヷヷレンムペヶヱヤヱレリルェタェ排縩맺ェォェユリヶヱペヱレヨムェタェゴゲゼケェォェヲヿェタェシグケカグェォェーヿェタェシグケカグェォェヲヿペルヰヨェタェゼゼェォェーヿペルヰヨェタェエェォェヷヿェタェエェォェヷヿペルヰヨェタェエェォェヷヿゴェタェエェォェヷヿゴペルヰヨェタェエェォェヷヿシェタェエェォェヷヿシペルヰヨェタェエェォェーヲヶェタェケザケカグェォェーヲヿェタェケケゼカグェォェーヲヽェタェケコケカグェォェーヲペルヰヨェタェゲェォェヷヲヶェタェコソゲカグェォェヷヲヽェタェゲゴゲカグェォェヷヲペルヰヨェタェエェォェヶヲヿェタェエェォェヶヲヿペルヰヨェタェエェォェヱメヿェタェエェォェヱメヿペルヰヨェタェエェォェモヲヶェタェエェォェモヲヽェタェエェォェモヲペルヰヨェタェエェォェメヲヶェタェエェォェメヲヽェタェエェォェメヲペルヰヨェタェエェヸォヾェヱヷヤレルペユリメムェタェミゴサソェォェヶヱヤヷヱペヶヱヤヱレリルェタェェォェムルメペヶヱヤヱレリルェタェェォェヶヱヤヷヱペヱレヨムェタェェォェムルメペヱレヨムェタェェォェャヷリヨペヱレヨムェタェゴケタケソェォェヤヷヷレンムペヱレヨムェタェゴザタゴゲェォェャヷリヨペヶヱヤヱレリルェタェ嵴架ェォェヤヷヷレンムペヶヱヤヱレリルェタェ排縩맺ェォェユリヶヱペヱレヨムェタェゴザケゼェォェヲヿェタェシグケカグェォェーヿェタェシグケカグェォェヲヿペルヰヨェタェゼゼェォェーヿペルヰヨェタェエェォェヷヿェタェエェォェヷヿペルヰヨェタェエェォェヷヿゴェタェエェォェヷヿゴペルヰヨェタェエェォェヷヿシェタェエェォェヷヿシペルヰヨェタェエェォェーヲヶェタェケザケカグェォェーヲヿェタェケケゼカグェォェーヲヽェタェケコケカグェォェーヲペルヰヨェタェエェォェヷヲヶェタェコソゲカグェォェヷヲヽェタェゲゴゲカグェォェヷヲペルヰヨェタェエェォェヶヲヿェタェエェォェヶヲヿペルヰヨェタェエェォェヱメヿェタェエェォェヱメヿペルヰヨェタェエェォェモヲヶェタェエェォェモヲヽェタェエェォェモヲペルヰヨェタェエェォェメヲヶェタェエェォェメヲヽェタェエェォェメヲペルヰヨェタェエェヸォヾェヱヷヤレルペユリメムェタェチゼサシェォェヶヱヤヷヱペヶヱヤヱレリルェタェェォェムルメペヶヱヤヱレリルェタェェォェヶヱヤヷヱペヱレヨムェタェェォェムルメペヱレヨムェタェェォェャヷリヨペヱレヨムェタェゴゼタケサェォェヤヷヷレンムペヱレヨムェタェサコタグコェォェャヷリヨペヶヱヤヱレリルェタェ嵴架排ェォェヤヷヷレンムペヶヱヤヱレリルェタェ排縩맺ェォェユリヶヱペヱレヨムェタェコゲコェォェヲヿェタェゲグコカサェォェーヿェタェエェォェヲヿペルヰヨェタェエェォェーヿペルヰヨェタェエェォェヷヿェタェエェォェヷヿペルヰヨェタェエェォェヷヿゴェタェエェォェヷヿゴペルヰヨェタェエェォェヷヿシェタェゲグコカサェォェヷヿシペルヰヨェタェエェォェーヲヶェタェエェォェーヲヿェタェエェォェーヲヽェタェエェォェーヲペルヰヨェタェエェォェヷヲヶェタェエェォェヷヲヽェタェエェォェヷヲペルヰヨェタェエェォェヶヲヿェタェエェォェヶヲヿペルヰヨェタェエェォェヱメヿェタェエェォェヱメヿペルヰヨェタェエェォェモヲヶェタェエェォェモヲヽェタェエェォェモヲペルヰヨェタェエェォェメヲヶェタェゴゴグサカサェォェメヲヽェタェゴシゼサカサェォェメヲペルヰヨェタェゼゼェヸォヾェヱヷヤレルペユリメムェタェチゼサケェォェヶヱヤヷヱペヶヱヤヱレリルェタェェォェムルメペヶヱヤヱレリルェタェェォェヶヱヤヷヱペヱレヨムェタェェォェムルメペヱレヨムェタェェォェャヷリヨペヱレヨムェタェゴゼタケグェォェヤヷヷレンムペヱレヨムェタェサゲタサゴェォェャヷリヨペヶヱヤヱレリルェタェ嵴架排ェォェヤヷヷレンムペヶヱヤヱレリルェタェ排縩맺ェォェユリヶヱペヱレヨムェタェコゲコェォェヲヿェタェゲグコカサェォェーヿェタェエェォェヲヿペルヰヨェタェエェォェーヿペルヰヨェタェエェォェヷヿェタェエェォェヷヿペルヰヨェタェエェォェヷヿゴェタェエェォェヷヿゴペルヰヨェタェエェォェヷヿシェタェゲグコカサェォェヷヿシペルヰヨェタェエェォェーヲヶェタェエェォェーヲヿェタェエェォェーヲヽェタェエェォェーヲペルヰヨェタェエェォェヷヲヶェタェエェォェヷヲヽェタェエェォェヷヲペルヰヨェタェエェォェヶヲヿェタェエェォェヶヲヿペルヰヨェタェエェォェヱメヿェタェエェォェヱメヿペルヰヨェタェエェォェモヲヶェタェエェォェモヲヽェタェエェォェモヲペルヰヨェタェエェォェメヲヶェタェゴゴグサカサェォェメヲヽェタェゴシゼサカサェォェメヲペルヰヨェタェゼゼェヸォヾェヱヷヤレルペユリメムェタェチゼゴサェォェヶヱヤヷヱペヶヱヤヱレリルェタェェォェムルメペヶヱヤヱレリルェタェェォェヶヱヤヷヱペヱレヨムェタェェォェムルメペヱレヨムェタェェォェャヷリヨペヱレヨムェタェゴゼタグサェォェヤヷヷレンムペヱレヨムェタェサゲタゴザェォェャヷリヨペヶヱヤヱレリルェタェ嵴架排ェォェヤヷヷレンムペヶヱヤヱレリルェタェ排縩맺ェォェユリヶヱペヱレヨムェタェコソザェォェヲヿェタェゲグコカサェォェーヿェタェエェォェヲヿペルヰヨェタェエェォェーヿペルヰヨェタェエェォェヷヿェタェエェォェヷヿペルヰヨェタェエェォェヷヿゴェタェエェォェヷヿゴペルヰヨェタェエェォェヷヿシェタェゲグコカサェォェヷヿシペルヰヨェタェエェォェーヲヶェタェエェォェーヲヿェタェエェォェーヲヽェタェエェォェーヲペルヰヨェタェエェォェヷヲヶェタェエェォェヷヲヽェタェエェォェヷヲペルヰヨェタェエェォェヶヲヿェタェエェォェヶヲヿペルヰヨェタェエェォェヱメヿェタェエェォェヱメヿペルヰヨェタェエェォェモヲヶェタェエェォェモヲヽェタェエェォェモヲペルヰヨェタェエェォェメヲヶェタェゴゴグサカサェォェメヲヽェタェゴシゼサカサェォェメヲペルヰヨェタェゼゼェヸォヾェヱヷヤレルペユリメムェタェチゼシソェォェヶヱヤヷヱペヶヱヤヱレリルェタェェォェムルメペヶヱヤヱレリルェタェェォェヶヱヤヷヱペヱレヨムェタェェォェムルメペヱレヨムェタェェォェャヷリヨペヱレヨムェタェゴゼタググェォェヤヷヷレンムペヱレヨムェタェサゲタゴソェォェャヷリヨペヶヱヤヱレリルェタェ嵴架排ェォェヤヷヷレンムペヶヱヤヱレリルェタェ排縩맺ェォェユリヶヱペヱレヨムェタェコソザェォェヲヿェタェゲグコカサェォェーヿェタェエェォェヲヿペルヰヨェタェエェォェーヿペルヰヨェタェエェォェヷヿェタェエェォェヷヿペルヰヨェタェエェォェヷヿゴェタェエェォェヷヿゴペルヰヨェタェエェォェヷヿシェタェゲグコカサェォェヷヿシペルヰヨェタェエェォェーヲヶェタェエェォェーヲヿェタェエェォェーヲヽェタェエェォェーヲペルヰヨェタェエェォェヷヲヶェタェエェォェヷヲヽェタェエェォェヷヲペルヰヨェタェエェォェヶヲヿェタェエェォェヶヲヿペルヰヨェタェエェォェヱメヿェタェエェォェヱメヿペルヰヨェタェエェォェモヲヶェタェエェォェモヲヽェタェエェォェモヲペルヰヨェタェエェォェメヲヶェタェゴゴグサカサェォェメヲヽェタェゴシゼサカサェォェメヲペルヰヨェタェエェヸヘヸ");
	System.out.println(s);
	}
	
	
}